#ifndef BuzzerSound_h
#define BuzzerSound_h

// ----- 声音名称定义-------
#define S_CONNECTION 0
#define S_DISCONNECTION 1
#define S_BUTTON_PUSHED 2
#define S_MODE1 3
#define S_MODE2 4
#define S_MODE3 5
#define S_SURPRISE 6
#define S_OHOOH 7
#define S_OHOOH2 8
#define S_CUDDLY 9
#define S_SLEEPING 10
#define S_HAPPY 11
#define S_SUPER_HAPPY 12
#define S_HAPPY_SHORT 13
#define S_SAD 14
#define S_CONFUSED 15
#define S_FART1 16
#define S_FART2 17
#define S_FART3 18
#define PIRATES 19
#define S_JUMP 20
#define S_BEEP 21
#define S_SIREN 22
#define TINY_WORLD 23
#define TRUE_GOODNESS_WORLD 24


#define debug true


// 定义一个蜂鸣器声音类，用于控制蜂鸣器播放音符和音效
class BuzzerSoundsClass
{
  public:
    // 初始化蜂鸣器引脚
    void Init(int buzzerPin);
    void InitBuzzer(int buzzerPin);

    // 声音相关方法
    void _tone(unsigned int noteFrequency, long noteDuration, int silentDuration) const;
    // 播放一个音符
    // 参数：
    // - noteFrequency: 音符的频率（单位：Hz）
    // - noteDuration: 音符的持续时间（单位：毫秒）
    // - silentDuration: 音符之间的静默时间（单位：毫秒）

    void bendTones(float initFrequency, float finalFrequency, float prop, long noteDuration, int silentDuration);
    // 播放一个频率渐变的音符（滑音效果）
    // 参数：
    // - initFrequency: 初始频率（单位：Hz）
    // - finalFrequency: 结束频率（单位：Hz）
    // - prop: 频率变化的比例（控制频率变化的速度）
    // - noteDuration: 音符的持续时间（单位：毫秒）
    // - silentDuration: 音符之间的静默时间（单位：毫秒）

    void play(int soundName); 
    // 播放预定义的声音（如警报声、提示音等）

  private:
    int buzzerPin; // 蜂鸣器连接的引脚编号
};

extern BuzzerSoundsClass buzzer;

// ------- 各种声音----------
#define NOTE_C0 16.35    // C0
#define NOTE_Db0 17.32   // C#0/Db0
#define NOTE_D0 18.35    // D0
#define NOTE_Eb0 19.45   // D#0/Eb0
#define NOTE_E0 20.6     // E0
#define NOTE_F0 21.83    // F0
#define NOTE_Gb0 23.12   // F#0/Gb0
#define NOTE_G0 24.5     // G0
#define NOTE_Ab0 25.96   // G#0/Ab0
#define NOTE_A0 27.5     // A0
#define NOTE_Bb0 29.14   // A#0/Bb0
#define NOTE_B0 30.87    // B0
#define NOTE_C1 32.7     // C1
#define NOTE_Db1 34.65   // C#1/Db1
#define NOTE_D1 36.71    // D1
#define NOTE_Eb1 38.89   // D#1/Eb1
#define NOTE_E1 41.2     // E1
#define NOTE_F1 43.65    // F1
#define NOTE_Gb1 46.25   // F#1/Gb1
#define NOTE_G1 49       // G1
#define NOTE_Ab1 51.91   // G#1/Ab1
#define NOTE_A1 55       // A1
#define NOTE_Bb1 58.27   // A#1/Bb1
#define NOTE_B1 61.74    // B1
#define NOTE_C2 65.41    // C2 (Middle C)
#define NOTE_Db2 69.3    // C#2/Db2
#define NOTE_D2 73.42    // D2
#define NOTE_Eb2 77.78   // D#2/Eb2
#define NOTE_E2 82.41    // E2
#define NOTE_F2 87.31    // F2
#define NOTE_Gb2 92.5    // F#2/Gb2
#define NOTE_G2 98       // G2
#define NOTE_Ab2 103.83  // G#2/Ab2
#define NOTE_A2 110      // A2
#define NOTE_Bb2 116.54  // A#2/Bb2
#define NOTE_B2 123.47   // B2
#define NOTE_C3 130.81   // C3
#define NOTE_Db3 138.59  // C#3/Db3
#define NOTE_D3 146.83   // D3
#define NOTE_Eb3 155.56  // D#3/Eb3
#define NOTE_E3 164.81   // E3
#define NOTE_F3 174.61   // F3
#define NOTE_Gb3 185     // F#3/Gb3
#define NOTE_G3 196      // G3
#define NOTE_Ab3 207.65  // G#3/Ab3
#define NOTE_A3 220      // A3
#define NOTE_Bb3 233.08  // A#3/Bb3
#define NOTE_B3 246.94   // B3
#define NOTE_C4 261.63   // C4
#define NOTE_Db4 277.18  // C#4/Db4
#define NOTE_D4 293.66   // D4
#define NOTE_Eb4 311.13  // D#4/Eb4
#define NOTE_E4 329.63   // E4
#define NOTE_F4 349.23   // F4
#define NOTE_Gb4 369.99  // F#4/Gb4
#define NOTE_G4 392      // G4
#define NOTE_Ab4 415.3   // G#4/Ab4
#define NOTE_A4 440      // A4
#define NOTE_Bb4 466.16  // A#4/Bb4
#define NOTE_B4 493.88   // B4
#define NOTE_C5 523.25   // C5
#define NOTE_Db5 554.37  // C#5/Db5
#define NOTE_D5 587.33   // D5
#define NOTE_Eb5 622.25  // D#5/Eb5
#define NOTE_E5 659.26   // E5
#define NOTE_F5 698.46   // F5
#define NOTE_Gb5 739.99  // F#5/Gb5
#define NOTE_G5 783.99   // G5
#define NOTE_Ab5 830.61  // G#5/Ab5
#define NOTE_A5 880      // A5
#define NOTE_Bb5 932.33  // A#5/Bb5
#define NOTE_B5 987.77   // B5
#define NOTE_C6 1046.5   // C6
#define NOTE_Db6 1108.73 // C#6/Db6
#define NOTE_D6 1174.66  // D6
#define NOTE_Eb6 1244.51 // D#6/Eb6
#define NOTE_E6 1318.51  // E6
#define NOTE_F6 1396.91  // F6
#define NOTE_Gb6 1479.98 // F#6/Gb6
#define NOTE_G6 1567.98  // G6
#define NOTE_Ab6 1661.22 // G#6/Ab6
#define NOTE_A6 1760     // A6
#define NOTE_Bb6 1864.66 // A#6/Bb6
#define NOTE_B6 1975.53  // B6
#define NOTE_C7 2093     // C7
#define NOTE_Db7 2217.46 // C#7/Db7
#define NOTE_D7 2349.32  // D7
#define NOTE_Eb7 2489.02 // D#7/Eb7
#define NOTE_E7 2637.02  // E7
#define NOTE_F7 2793.83  // F7
#define NOTE_Gb7 2959.96 // F#7/Gb7
#define NOTE_G7 3135.96  // G7
#define NOTE_Ab7 3322.44 // G#7/Ab7
#define NOTE_A7 3520     // A7
#define NOTE_Bb7 3729.31 // A#7/Bb7
#define NOTE_B7 3951.07  // B7
#define NOTE_C8 4186.01  // C8
#define NOTE_Db8 4434.92 // C#8/Db8
#define NOTE_D8 4698.64  // D8
#define NOTE_Eb8 4978.03 // D#8/Eb8

const int songspeed = 1;

const double notes[] = {
    NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
    NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0, NOTE_A4, NOTE_G4, NOTE_A4, 0,
};
const int duration[] = {
    125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 375, 125,
};

#endif
